<?
class Rule_Login extends Rule
{
	public $table;
	public $error_message="Вы ввели неверное/неактивное имя пользователя или неверный пароль";
	public $max_tries=5;   // сколько неудачных попыток до бана по ip
	
	function __construct($name,$table="login", $error_message="")
	{
		$this->name=$name;
		$this->table=$table;
		if($error_message!="") $this->error_message = $error_message;
	}
	
	function Check($hash)
	{
		$ip = sprintf("%u", ip2long($_SERVER['REMOTE_ADDR']));
		$row = DB::singleRow("select count(*) as cnt,max(dt) as maxdt from login_try where ip={$ip} and dt>".(time()-3600) );
		
		if( $row['cnt'] >= $this->max_tries)
		{
			if(time()-$row['dt']>3000)	
			{
				$this->error_message = 'Больше '.$this->max_tries.' неудачных попыток. Попробуйте снова через час';
			}
			else 
			{
				$this->error_message = 'Больше '.$this->max_tries.' неудачных попыток. Попробуйте снова через '.ceil((time()-$row['dt'])/60).' мин.';
			}
			return false;
		}
		
		
		$email = '';
		$loginid = 0;
		if(instr($hash['login'],'@')) $email = $hash['login'];
		
		if($email)
		{
			$loginid = DB::scalarSelect("select loginid from profile where email=? limit 1", $email );
			if(!$loginid)
			{
				$this->error_message = 'Данный e-mail ('.$email.') не зарегистрирован на сайте. Правильно ли вы набрали адрес?';
				return false;
			}
		}
		
		if($loginid)
		{
			$id = DB::scalarSelect("select id from {$this->table} where id = ?i and password = ?",
																																				 $loginid, $hash['password'] );
		}
		else
		{
			$id = DB::scalarSelect("select id from {$this->table} where login = ? and password = ? limit 1",
																																				 $hash['login'], $hash['password'] );
		}
		if($id) return true;
		
		// узнаем что именно не верно
		if($loginid)
		{
			$hash['login'] = DB::scalarSelect("select login from {$this->table} where id = ?i", $loginid );
			$this->error_message = 'Вы ввели неправильный пароль, попробуйте еще раз';
		}
		else
		{
			$id = DB::scalarSelect("select id from {$this->table} where login = ?", $hash['login']);
			if($id)
			{
				$this->error_message = 'Вы ввели неправильный пароль, попробуйте еще раз';
			}
			else
			{
				$this->error_message = 'Пользователь с таким именем не найден. Пожалуйста, вводите имя внимательнее';
			}
		}
		
		// записываем неудачную попытку в лог
		DB::insert("login_try",Array(			"ip"=>$ip,
																			"dt"=>time(),
																			"login"=>$hash['login'],
																			"password"=>$hash['password']
																));
		return false;
	}
}